package net.sf.rose.util;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.reflect.Method;

import org.apache.log4j.Logger;

/**
 * 类说明：通用类定义操作类
 * 
 * @author fengjian
 * @since 2016/05/09
 */
public class ClassUtils {

	private static Logger LOG = Logger.getLogger(ClassUtils.class);

	/**
	 * 功能：获取类的反射方法
	 * 
	 * @param entity     类Class
	 * @param methodName 方法名称
	 * @return 方法
	 */
	public static Method getMethod(Class<?> entity, String methodName) {
		for (Method method : entity.getMethods()) {
			if (method.getName().equals(methodName)) {
				return method;
			}
		}
		return null;
	}

	/**
	 * 功能：执行某个类的方法
	 * 
	 * @param obj        类对象
	 * @param methodName 类访求名称
	 * @param args       参数
	 * @return 反映执行结果
	 */
	public static Object execute(Object obj, String methodName, Object[] args) {
		Method m = getMethod(obj.getClass(), methodName);
		try {
			return m.invoke(obj, args);
		} catch (Exception e) {
			LOG.error(e);
			throw new RoseRuntimeException(e);
		}
	}

	/**
	 * 功能：将需要强制捕获的异常转换成非强制捕获的异常
	 * 
	 * @param message 自定义异常消息
	 * @param e       异常类实体
	 * @return 非强制捕获的异常
	 */
	public static RuntimeException getException(String message, Exception e) {
		String cn = e.getClass().getName();
		cn = cn + "current thread:" + Thread.currentThread().getId();
		cn = cn + ": " + e.getMessage();
		cn = cn + '\n' + message;
		return new RoseRuntimeException(cn, e);
	}

	/**
	 * 功能：将需要强制捕获的异常转换成非强制捕获的异常
	 * 
	 * @param e 异常类实体
	 * @return 非强制捕获的异常
	 */
	public static RuntimeException getException(Exception e) {
		String cn = e.getClass().getName();
		cn = cn + "current thread:" + Thread.currentThread().getId();
		cn = cn + ": " + e.getMessage();
		return new RoseRuntimeException(cn, e);
	}

	/**
	 * 功能：返回路径
	 * 
	 * @return 路径数组
	 */
	public static String[] getClassPathArray() {
		return System.getProperty("java.class.path").concat(System.getProperty("path.separator"))
				.concat(System.getProperty("java.home")).split(System.getProperty("path.separator"));
	}

	/**
	 * 根据类名称获取Class字节码文件流
	 * 
	 * @param className - 类名称
	 * @throws Exception - 异常
	 * @return 返回字节数组
	 * @throws Exception 招聘异常
	 */
	public static byte[] getClass(String className) throws Exception {
		// net.sf.rose.api.InterfaceClassBean
		Class<?> c = Class.forName(className);
		// net/sf/rose/api/InterfaceClassBean.class
		String name = className.replace('.', '/') + ".class";
		InputStream in = c.getClassLoader().getResourceAsStream(name);
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024 * 4];
		int n = 0;
		while ((n = in.read(buffer)) != -1) {
			bout.write(buffer, 0, n);
		}
		return bout.toByteArray();
	}

}
